package com.ruoyi.common.utils;

import cn.hutool.core.lang.UUID;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.ruoyi.common.entity.StorageConfig;
import com.ruoyi.common.service.StorageConfigService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 阿里云OSS上传工具类（动态从数据库获取配置）
 * @author 0617
 */
@Component
public class AliyunOssUploadUtils {

    // 非静态字段，允许Spring注入
    @Autowired
    private StorageConfigService storageConfigService;

    /**
     * 上传文件（仅接收MultipartFile参数，内部生成UUID文件名）
     * @param file 上传的文件
     * @return 文件访问URL
     */
    public String uploadFile(MultipartFile file) throws Exception {
        // 1. 生成UUID文件名（在工具类内部处理）
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String originalFilename = file.getOriginalFilename();
        String fileExtension = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        String uniqueFileName = uuid + fileExtension;

        // 2. 查询配置
        StorageConfig aliyunConfig = storageConfigService.getByStorageType("aliyun");
        if (aliyunConfig == null) {
            throw new RuntimeException("未配置阿里云OSS信息，请先在系统中配置");
        }

        // 3. 创建OSS客户端
        OSS ossClient = new OSSClientBuilder().build(
                aliyunConfig.getEndpoint(),
                aliyunConfig.getAccessKey(),
                aliyunConfig.getSecretKey()
        );

        // 4. 构建文件路径
        String fileHost ="upload";
        String fullPath = fileHost + "/" + uniqueFileName;

        try {
            // 5. 上传文件
            ossClient.putObject(aliyunConfig.getBucketName(), fullPath, file.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException("文件上传失败：" + e.getMessage(), e);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        // 6. 生成访问URL
        String url = "https://" + aliyunConfig.getBucketName() + "." + aliyunConfig.getEndpoint() + "/" + fullPath;

        // 7. 如果需要返回生成的UUID文件名，可以通过其他方式（如封装成对象）
        // 这里为了保持方法签名简单，仅返回URL，文件名可以从URL中解析

        return url;
    }
}
